

package org.javahispano.javacup.tacticas_aceptadas.infrapc;

import org.javahispano.javacup.modelo.*;


import java.awt.Color;
import java.util.LinkedList;
import java.util.List;
import java.util.Random;

public class TacticaSuns implements Tactica {
    
	
	class TacticaSunsDetalle implements TacticaDetalle {

	    public String getNombre() {
	        return "suns";
	    }

	    public String getPais() {
	        return "Bolivia";
	    }

	    public String getEntrenador() {
	        return "Inti";
	    }

	    public Color getColorCamiseta() {
	        return new Color(0, 0, 0);
	    }

	    public Color getColorPantalon() {
	        return new Color(0, 51, 51);
	    }

	    public Color getColorFranja() {
	        return new Color(0, 51, 51);
	    }

	    public Color getColorCalcetas() {
	        return new Color(0, 51, 51);
	    }

	    public Color getColorPortero() {
	        return new Color(0, 102, 102        );
	    }

	    public EstiloUniforme getEstilo() {
	        return EstiloUniforme.SIN_ESTILO;
	    }

	    public Color getColorCamiseta2() {
	        return new Color(255, 255, 255);
	    }

	    public Color getColorPantalon2() {
	        return new Color(0, 51, 51);
	    }

	    public Color getColorFranja2() {
	        return new Color(0, 51, 51);
	    }

	    public Color getColorCalcetas2() {
	        return new Color(0, 51, 51);
	    }

	    public Color getColorPortero2() {
	        return new Color(0, 204, 153        );
	    }

	    public EstiloUniforme getEstilo2() {
	        return EstiloUniforme.SIN_ESTILO;
	    }

	    class JugadorImpl implements JugadorDetalle {

	        String nombre;
	        int numero;
	        Color piel, pelo;
	        double velocidad, remate, presicion;
	        boolean portero;
	        Posicion posicion;

	        public JugadorImpl(String nombre, int numero, Color piel, Color pelo,
	                double velocidad, double remate, double presicion, boolean portero) {
	            this.nombre=nombre;
	            this.numero=numero;
	            this.piel=piel;
	            this.pelo=pelo;
	            this.velocidad=velocidad;
	            this.remate=remate;
	            this.presicion=presicion;
	            this.portero=portero;
	        }

	        public String getNombre() {
	            return nombre;
	        }

	        public Color getColorPiel() {
	            return piel;
	        }

	        public Color getColorPelo() {
	            return pelo;
	        }

	        public int getNumero() {
	            return numero;
	        }

	        public boolean esPortero() {
	            return portero;
	        }

	        public double getVelocidad() {
	            return velocidad;
	        }

	        public double getRemate() {
	            return remate;
	        }

	        public double getPresicion() {
	            return presicion;
	        }

	    }

	    public JugadorDetalle[] getJugadores() {
	        return new JugadorDetalle[]{
	        		new JugadorImpl("Arias", 1, new Color(153,102,0), new Color(0,0,0),0.96d,0.52d,0.63d, true),
	                new JugadorImpl("Choco Rivero", 2, new Color(255,200,150), new Color(102,102,0),1.0d,0.63d,0.73d, false),
	                new JugadorImpl("Ronal Raldes", 3, new Color(255,200,150), new Color(0,0,0),1.0d,0.61d,0.67d, false),
	                new JugadorImpl("Gati riveiro", 4, new Color(153,102,0), new Color(0,0,0),1.0d,0.54d,0.52d, false),
	                new JugadorImpl("zabala", 5, new Color(153,102,0), new Color(0,0,0),1.0d,0.56d,0.56d, false),
	                new JugadorImpl("inti padilla", 6, new Color(153,102,0), new Color(50,0,0),1.0d,0.72d,0.76d, false),
	                new JugadorImpl("Bomba", 7, new Color(255,200,150), new Color(50,0,0),0.75d,1.0d,1.0d, false),
	                new JugadorImpl("Sacha Lima", 8, new Color(255,200,150), new Color(50,0,0),0.79d,1.0d,1.0d, false),
	                new JugadorImpl("Marcelo Martins", 9, new Color(255,200,150), new Color(50,0,0),1.0d,0.91d,1.0d, false),
	                new JugadorImpl("Pajaro Escobar", 10, new Color(255,200,150), new Color(50,0,0),0.92d,0.83d,1.0d, false),
	                new JugadorImpl("Botero", 11, new Color(153,102,0), new Color(50,0,0),0.94d,0.95d,1.0d, false)
	        };
	    }
	}
	
	TacticaSunsDetalle detalle=new TacticaSunsDetalle();

    Posicion alineacion1[]=new Posicion[]{
        new Posicion(0.2595419847328244,-50.41044776119403),
        new Posicion(-10.6993006993007,-32.782805429864254),
        new Posicion(9.986013986013985,-32.30769230769231),
        new Posicion(26.391608391608393,-23.28054298642534),
        new Posicion(-27.58041958041958,-23.993212669683256),
        new Posicion(0.0,-17.57918552036199),
        new Posicion(-7.846153846153847,11.402714932126697),
        new Posicion(10.223776223776223,10.927601809954751),
        new Posicion(-15.216783216783217,30.6447963800905),
        new Posicion(0.23776223776223776,19.479638009049776),
        new Posicion(16.643356643356643,36.10859728506787)
    };

    Posicion alineacion2[]=new Posicion[]{
        new Posicion(0.2595419847328244,-50.41044776119403),
        new Posicion(-11.16030534351145,-31.082089552238806),
        new Posicion(11.16030534351145,-31.6044776119403),
        new Posicion(23.3006993006993,-23.993212669683256),
        new Posicion(-26.867132867132867,-23.28054298642534),
        new Posicion(-1.188811188811189,-20.667420814479637),
        new Posicion(17.594405594405593,5.9389140271493215),
        new Posicion(-18.545454545454543,12.59049773755656),
        new Posicion(-8.55944055944056,33.49547511312217),
        new Posicion(1.902097902097902,23.755656108597286),
        new Posicion(11.174825174825173,38.72171945701358)
    };

    Posicion alineacion3[]=new Posicion[]{
            new Posicion(0.2595419847328244,-50.41044776119403),
            new Posicion(-8.083916083916083,-37.53393665158371),
            new Posicion(8.55944055944056,-37.53393665158371),
            new Posicion(20.447552447552447,-29.457013574660635),
            new Posicion(-18.545454545454543,-27.31900452488688),
            new Posicion(0.0,-32.54524886877828),
            new Posicion(-17.11888111888112,-4.98868778280543),
            new Posicion(14.503496503496503,-9.97737556561086),
            new Posicion(-9.272727272727272,7.839366515837104),
            new Posicion(-0.7132867132867133,-16.153846153846153),
            new Posicion(4.041958041958042,15.203619909502263)
        };

    Posicion alineacion4[]=new Posicion[]{
            new Posicion(0.2595419847328244,-50.41044776119403),
            new Posicion(-11.888111888111888,-18.766968325791854),
            new Posicion(6.181818181818182,-17.57918552036199),
            new Posicion(18.545454545454543,-3.3257918552036196),
            new Posicion(-20.923076923076923,-4.751131221719457),
            new Posicion(-0.7132867132867133,-27.556561085972852),
            new Posicion(-6.419580419580419,23.755656108597286),
            new Posicion(6.419580419580419,17.104072398190045),
            new Posicion(-13.314685314685315,34.68325791855204),
            new Posicion(-0.4755244755244755,4.038461538461538),
            new Posicion(13.076923076923078,41.334841628959275)
        };

    Posicion alineacion5[]=new Posicion[]{
        new Posicion(0.2595419847328244,-50.41044776119403),
        new Posicion(-11.16030534351145,-31.082089552238806),
        new Posicion(11.16030534351145,-31.6044776119403),
        new Posicion(27.251908396946565,-27.94776119402985),
        new Posicion(-29.84732824427481,-26.902985074626866),
        new Posicion(-4.5174825174825175,-19.717194570135746),
        new Posicion(-21.16083916083916,-0.7126696832579186),
        new Posicion(19.020979020979023,-1.4253393665158371),
        new Posicion(-1.902097902097902,-1.1877828054298643),
        new Posicion(4.9930069930069925,-12.59049773755656),
        new Posicion(2.13986013986014,0.0)
    };

    Posicion alineacion6[]=new Posicion[]{
        new Posicion(0.2595419847328244,-50.41044776119403),
        new Posicion(-11.16030534351145,-31.082089552238806),
        new Posicion(11.16030534351145,-31.6044776119403),
        new Posicion(26.732824427480914,-20.111940298507463),
        new Posicion(-29.32824427480916,-21.67910447761194),
        new Posicion(-3.804195804195804,-11.877828054298643),
        new Posicion(-17.11888111888112,-20.192307692307693),
        new Posicion(13.79020979020979,-20.192307692307693),
        new Posicion(-15.216783216783217,0.0),
        new Posicion(4.041958041958042,-12.115384615384617),
        new Posicion(14.027972027972028,-0.7126696832579186)
    };

    public Posicion[] getPosicionSaca(SituacionPartido sp) {
    return alineacion5;
    }

    public Posicion[] getPosicionRecive(SituacionPartido sp) {
    return alineacion6;
    }

    public TacticaDetalle getDetalle() {
        return detalle;
    }

    Random rand = new Random();
    LinkedList<Comando> comandos = new LinkedList<Comando>();
    
    public List<Comando> ejecutar(SituacionPartido sp) {
    	
        
        comandos.clear();
        
        if (sp.balon().getY() <= Constantes.centroCampoJuego.getY()) {
            
            for (int i = 0; i < 11; i++) {
                comandos.add(new ComandoIrA(i, alineacion3[i]));
                
            }
            Posicion yo[] = sp.misJugadores();

            Posicion el[] = sp.rivales();
            int co=10;
             for(int ii = 1; ii < 9; ii++) {
                 double y = el[co].getY();
                double x = el[co].getX();
                 if(sp.balon().getY() < y) y -= 2;
                else y += 2;
                 if(sp.balon().getX() < x) x -= 2;
                    else x += 2;
                    comandos.add(new ComandoIrA(ii, new Posicion(x, y)));
               co--;
            } 
                
             
            
                       
            
            
        } else {
            
            for (int i = 0; i < 11; i++) {
                comandos.add(new ComandoIrA(i, alineacion4[i]));
            }
            Posicion yo[] = sp.misJugadores();

            Posicion el[] = sp.rivales();
            comandos.add(new ComandoIrA(1, el[10]));
                    comandos.add(new ComandoIrA(2, el[9]));
                    comandos.add(new ComandoIrA(3, el[8]));
        }
        
        

               
        
        
       
        if(sp.balon().getY()<Constantes.centroCampoJuego.getY()){
        	
        	int[] cercano = sp.balon().indicesMasCercanos(sp.misJugadores());
        for (int i = 0; i < 2; i++) {
        	
            comandos.add(new ComandoIrA(cercano[i], sp.balon()));
        	
        	     		
                
        }
        }
        else{
        	

            int indMasCercano = sp.balon().indiceMasCercano(sp.misJugadores());
         
            comandos.add(new ComandoIrA(indMasCercano, sp.balon()));	
        	
        }
        
        
        int rematan[] = sp.puedenRematar();
       
        for (int i : rematan) {
          
            int[] cercanos = sp.misJugadores()[i].indicesMasCercanos(sp.misJugadores());
           
            boolean pase = false;
            boolean alto,cerc=false;
           
            
            
            for (int j = 1; !pase && j < cercanos.length; j++) {
              
                if (sp.misJugadores()[i].getY() < sp.misJugadores()[cercanos[j]].getY()) {
                  
                	if(sp.balon().getY()>Constantes.centroCampoJuego.getY()){
                    if (sp.misJugadores()[i].distancia(sp.misJugadores()[cercanos[j]]) > 20) {
                        alto = true;
                    } else {
                    	cerc=true;
                        alto = false;
                    }
                    if(sp.detalleMisJugadores()[i].getNumero()==1||sp.detalleMisJugadores()[i].getNumero()==2||sp.detalleMisJugadores()[i].getNumero()==3||sp.detalleMisJugadores()[i].getNumero()==4||sp.detalleMisJugadores()[i].getNumero()==5)
                    	comandos.add(new ComandoGolpearBalon(i, Constantes.penalSup, .9 + rand.nextDouble() * .6, true));
                    if(cerc)
                    	         	comandos.add(new ComandoGolpearBalon(i, sp.misJugadores()[cercanos[j]], .5 + rand.nextDouble() * .2, alto));
                    else
                        if(sp.detalleMisJugadores()[i].getNumero()==11){
                    comandos.add(new ComandoGolpearBalon(i, Constantes.penalSup, .4 + rand.nextDouble() * .4, alto));
                        }else{
                        comandos.add(new ComandoGolpearBalon(i, sp.misJugadores()[cercanos[j]], .5 + rand.nextDouble() * .4, alto));
                        }
               
                    pase = true;
                }else{ 
                
                	comandos.add(new ComandoGolpearBalon(i, sp.misJugadores()[cercanos[j]], .9 + rand.nextDouble() * .3, true));
               
              
                pase = true;
            }
                }
                	
                	
                }
            
         
            if (!pase) {
               
                if (sp.misJugadores()[i].distancia(sp.misJugadores()[cercanos[1]]) > 17) {
                    alto = true;
                } else {
                    alto = false;
                }
                if(alto){
                    
                       comandos.add(new ComandoIrA(i, Constantes.penalSup));
                comandos.add(new ComandoGolpearBalon(i, Constantes.penalSup, .6 + rand.nextDouble() * .5, alto));
                }else
                    comandos.add(new ComandoIrA(i, Constantes.penalSup));
                	comandos.add(new ComandoGolpearBalon(i, Constantes.penalSup, .5 + rand.nextDouble() * .5, alto));
            }
          
            
            	       	if(sp.detalleMisJugadores()[i].getNumero()==7||sp.detalleMisJugadores()[i].getNumero()==8){
            	       		if (sp.misJugadores()[i].distancia(Constantes.centroArcoSup) < 31) 
                comandos.add(new ComandoGolpearBalon(i, Constantes.centroArcoSup, 1, 33.0));}
            	      
                        	if(sp.detalleMisJugadores()[i].getNumero()==10||sp.detalleMisJugadores()[i].getNumero()==9||sp.detalleMisJugadores()[i].getNumero()==11){
                        		if (sp.misJugadores()[i].distancia(Constantes.centroArcoSup) < 24)
                                            
                                            comandos.add(new ComandoGolpearBalon(i, Constantes.centroArcoSup, 1+ rand.nextDouble() * .1, 19.0));
                                        
                        	}
                 
            
            
            
        }
    
        return comandos;
    }
}
